package edu.uoc.tds.pec4.gestor.impl;

import edu.uoc.tds.pec4.gestor.GestorMantenimiento;
import edu.uoc.tds.pec4.model.SS1_CentroDocente;
import edu.uoc.tds.pec4.model.SS1_TipoEvento;
import edu.uoc.tds.pec4.model.SS1_Universidad;
import edu.uoc.tds.pec4.model.SS1_Usuario;
import edu.uoc.tds.pec4.util.ExceptionUtils;
import edu.uoc.tds.pec4.util.LanguageUtils;
import java.io.Serializable;
import java.rmi.RemoteException;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

/**
 * Tecnicas de Desarrollo de Software - (UOC)
 *
 * @author Grupo Magicsoftware
 * @version 1.0
 */
public class GestorMantenimientoImpl extends GestorDiscoImpl implements GestorMantenimiento, Serializable {
    private static final long serialVersionUID = 1L;

    public GestorMantenimientoImpl() throws RemoteException {
        
    }

    @Override
    public String getCodigo(String nombre, String apellido1, String apellido2) throws RemoteException, SQLException {
        int i = 1;
        String l = null;
        boolean fin = false;
        conectaBD();
        Statement st = getConexion().createStatement
                    (ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE);

        while (!fin){
            l = nombre.substring(0, 3) + apellido1.substring(0, 3) +
                    apellido2.substring(0, 3) + i;

            String query = "SELECT * FROM USUARIO WHERE loguin = '" + l + "'";

            ResultSet rs = st.executeQuery(query);

            if (!rs.next()) fin = true;
            else i++;
            rs.close();
        }
        desconectaBD();
        return l;
    }

    @Override
    public List<SS1_Universidad> getUniversidades() throws RemoteException, SQLException {
        List<SS1_Universidad> universidades = new ArrayList<SS1_Universidad>();
        try {
            conectaBD();
            ResultSet rs = select("UNIVERSIDAD");

            while (rs.next()){
                SS1_Universidad uni = new SS1_Universidad();
                uni.setId(rs.getInt("cod_Universidad"));
                uni.setNombre(rs.getString("nombre"));
                universidades.add(uni);
            }
            rs.close();
            desconectaBD();

        } catch (SQLException e) {
            ExceptionUtils.visualizarError(LanguageUtils.getMessage("ERR_Remote"));
        } catch (Exception e){
            ExceptionUtils.visualizarError(e.getMessage());
        }
        return universidades;
    }

    @Override
    public List<SS1_CentroDocente> getCentrosDocentes() throws RemoteException, SQLException {
        return getCentrosDocentes("");
    }

    @Override
    public List<SS1_CentroDocente> getCentrosDocentes(String condicion) throws RemoteException, SQLException {
        List<SS1_CentroDocente> centros = new ArrayList<SS1_CentroDocente>();

        conectaBD();
        String query = "SELECT * FROM CENTRODOCENTE";
        if (!condicion.equals("")){
             query = query.concat(" WHERE " + condicion);
        }
        
        PreparedStatement st = getConexion().prepareStatement
                    (query, ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE);

        ResultSet rs = st.executeQuery();
        ResultSet aux = null;

        while (rs.next()){
            SS1_CentroDocente centro = new SS1_CentroDocente();
            centro.setId(rs.getInt("cod_CentroDocente"));
            centro.setNombre(rs.getString("nombre"));
            try {
                aux = select("UNIVERSIDAD", "cod_Universidad = '" + rs.getInt("cod_Universidad") + "'");
            } catch (Exception e) {}
            aux.next();
            SS1_Universidad uni = new SS1_Universidad();
            uni.setId(aux.getInt("cod_Universidad"));
            uni.setNombre(aux.getString("nombre"));
            centro.setUniversidad(uni);
            aux.close();
            centro.setDireccion(rs.getString("direccion"));
            centro.setLocalidad(rs.getString("localidad"));
            centro.setCodigoPostal(Integer.parseInt(rs.getString("codigo_postal")));
            centro.setPaisResidencia(rs.getString("pais"));
            centro.setTelefono(rs.getString("telefono"));
            centro.setEmail(rs.getString("email"));
            centro.setWeb(rs.getString("web"));
            String s = rs.getString("activo");
            if (s.equals("1")) centro.setActivo(true);
            else if (s.equals("0")) centro.setActivo(false);
            centro.setFechaActividad(rs.getDate("fecha_actividad"));
            centro.setFechaAlta(rs.getDate("fecha_alta"));

            centros.add(centro);
        }

        rs.close();
        desconectaBD();

        return centros;
    }

    @Override
    public List<SS1_Usuario> getUsuarios(String condicion) throws RemoteException, SQLException {
        List<SS1_Usuario> usuarios = new ArrayList<SS1_Usuario>();
        ResultSet rs = null;

        try {
            conectaBD();
            if (!condicion.equals("")){
                rs = select("USUARIO", condicion);
            } else {
                rs = select("USUARIO");
            }

            while (rs.next()){
                SS1_Usuario usuario = new SS1_Usuario();

                usuario.setId(rs.getInt("cod_Usuario"));
                usuario.setCodigo(rs.getString("loguin"));
                usuario.setContrasenya(rs.getString("contrasenya"));
                usuario.setTipoUsuario(rs.getInt("tipo_usuario"));
                try {
                    usuario.setCentroDocente(getCentrosDocentes("cod_CentroDocente = '" +
                        rs.getInt("cod_CentroDocente") + "'").get(0));
                } catch (SQLException e) {
                    ExceptionUtils.visualizarError(LanguageUtils.getMessage("ERR_inesperado"));
                }
                usuario.setRol(rs.getInt("rol"));
                usuario.setPaisDocumento(rs.getString("pais_documento"));
                usuario.setTipoDocumento(rs.getString("tipo_documento"));
                usuario.setNumeroDocumento(rs.getString("numero_documento"));
                usuario.setNombre(rs.getString("nombre"));
                usuario.setApellido1(rs.getString("apellido1"));
                usuario.setApellido2(rs.getString("apellido2"));
                String s = rs.getString("varon");
                if (s.equals("1")) usuario.setVaron(true);
                else if (s.equals("0")) usuario.setVaron(false);
                usuario.setFechaNacimiento(rs.getDate("fecha_nacimiento"));
                usuario.setDireccion(rs.getString("direccion"));
                usuario.setLocalidad(rs.getString("localidad"));
                usuario.setCodigoPostal(Integer.parseInt(rs.getString("codigo_postal")));
                usuario.setPaisResidencia(rs.getString("pais_residencia"));
                usuario.setTelefono(rs.getString("telefono"));
                usuario.setEmail(rs.getString("email"));
                usuario.setWeb(rs.getString("web"));
                usuario.setBanco(rs.getString("ccc_banco"));
                usuario.setSucursal(rs.getString("ccc_sucursal"));
                usuario.setDC(rs.getString("ccc_dc"));
                usuario.setCuenta(rs.getString("ccc_cuenta"));
                s = rs.getString("activo");
                if (s.equals("1")) usuario.setActivo(true);
                else if (s.equals("0")) usuario.setActivo(false);
                usuario.setFechaActividad(rs.getDate("fecha_actividad"));
                usuario.setFechaAlta(rs.getDate("fecha_alta"));

                usuarios.add(usuario);
            }

            rs.close();
            desconectaBD();

        } catch (SQLException e) {
            ExceptionUtils.visualizarError(LanguageUtils.getMessage("ERR_Remote"));
        } catch (Exception e){
            ExceptionUtils.visualizarError(e.getMessage());
        }
        return usuarios;
    }

    @Override
    public List<String> getPaises() throws RemoteException, SQLException {
        List<String> paises = new ArrayList<String>();
        try {
            conectaBD();
            ResultSet rs = select("pais");

            while (rs.next()){
                paises.add(rs.getString("nombre"));
            }

            rs.close();
            desconectaBD();

        } catch (SQLException e) {
            ExceptionUtils.visualizarError(LanguageUtils.getMessage("ERR_Remote"));
        } catch (Exception e){
            ExceptionUtils.visualizarError(e.getMessage());
        }
        return paises;
    }

    @Override
    public void insertUsuario(SS1_Usuario usuario) throws RemoteException, SQLException {
        conectaBD();

        PreparedStatement st = null;

        String query = "INSERT INTO USUARIO (contrasenya, tipo_usuario, cod_centrodocente, rol, "
                + "pais_documento, tipo_documento, numero_documento, nombre, apellido1, "
                + "apellido2, varon, fecha_nacimiento, direccion, localidad, codigo_postal, "
                + "pais_residencia, telefono, email, web, ccc_banco, ccc_sucursal, "
                + "ccc_dc, ccc_cuenta, activo, fecha_actividad, fecha_alta, loguin)"
                + " VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?"
                + ", ?, ?, ?, ?, ?, ?)";
        st = getConexion().prepareStatement
                    (query, ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE);
        st.setString(1, usuario.getContrasenya());
        st.setInt(2, usuario.getTipoUsuario());
        st.setInt(3, usuario.getCentroDocente().getId());
        st.setInt(4, usuario.getRol());
        st.setString(5, usuario.getPaisDocumento());
        st.setString(6, usuario.getTipoDocumento());
        st.setString(7, usuario.getNumeroDocumento());
        st.setString(8, usuario.getNombre());
        st.setString(9, usuario.getApellido1());
        st.setString(10, usuario.getApellido2());
        if (usuario.isVaron()) st.setString(11, "1");
        else st.setString(11, "0");
        st.setDate(12, new Date(usuario.getFechaNacimiento().getTime()));
        st.setString(13, usuario.getDireccion());
        st.setString(14, usuario.getLocalidad());
        st.setString(15, Integer.toString(usuario.getCodigoPostal()));
        st.setString(16, usuario.getPaisResidencia());
        st.setString(17, usuario.getTelefono());
        st.setString(18, usuario.getEmail());
        st.setString(19, usuario.getWeb());
        st.setString(20, usuario.getBanco());
        st.setString(21, usuario.getSucursal());
        st.setString(22, usuario.getDC());
        st.setString(23, usuario.getCuenta());
        if (usuario.isActivo()) st.setString(24, "1");
        else st.setString(24, "0");
        st.setDate(25, new Date(usuario.getFechaActividad().getTime()));
        st.setDate(26, new Date(usuario.getFechaAlta().getTime()));
        st.setString(27, usuario.getCodigo());
        st.execute();

        st.close();
        desconectaBD();
    }

    @Override
    public void updateUsuario(int id, SS1_Usuario usuario) throws RemoteException, SQLException {
        conectaBD();

        PreparedStatement st = null;

        String query = "UPDATE USUARIO SET contrasenya = ?, tipo_usuario = ?,"
                + " cod_centrodocente = ?, rol = ?, pais_documento = ?,"
                + " tipo_documento = ?, numero_documento = ?, nombre = ?,"
                + " apellido1 = ?, apellido2 = ?, varon = ?, fecha_nacimiento = ?,"
                + " direccion = ?, localidad = ?, codigo_postal = ?, "
                + "pais_residencia = ?, telefono = ?, email = ?, web = ?,"
                + " ccc_banco = ?, ccc_sucursal = ?, ccc_dc = ?, ccc_cuenta = ?,"
                + " activo = ?, fecha_actividad = ?, fecha_alta = ?, loguin = ?"
                + " WHERE cod_Usuario = " + id;
        st = getConexion().prepareStatement
                    (query, ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE);
        st.setString(1, usuario.getContrasenya());
        st.setInt(2, usuario.getTipoUsuario());
        st.setInt(3, usuario.getCentroDocente().getId());
        st.setInt(4, usuario.getRol());
        st.setString(5, usuario.getPaisDocumento());
        st.setString(6, usuario.getTipoDocumento());
        st.setString(7, usuario.getNumeroDocumento());
        st.setString(8, usuario.getNombre());
        st.setString(9, usuario.getApellido1());
        st.setString(10, usuario.getApellido2());
        if (usuario.isVaron()) st.setString(11, "1");
        else st.setString(11, "0");
        st.setDate(12, new Date(usuario.getFechaNacimiento().getTime()));
        st.setString(13, usuario.getDireccion());
        st.setString(14, usuario.getLocalidad());
        st.setString(15, Integer.toString(usuario.getCodigoPostal()));
        st.setString(16, usuario.getPaisResidencia());
        st.setString(17, usuario.getTelefono());
        st.setString(18, usuario.getEmail());
        st.setString(19, usuario.getWeb());
        st.setString(20, usuario.getBanco());
        st.setString(21, usuario.getSucursal());
        st.setString(22, usuario.getDC());
        st.setString(23, usuario.getCuenta());
        if (usuario.isActivo()) st.setString(24, "1");
        else st.setString(24, "0");
        st.setDate(25, new Date(usuario.getFechaActividad().getTime()));
        st.setDate(26, new Date(usuario.getFechaAlta().getTime()));
        st.setString(27, usuario.getCodigo());
        st.execute();

        st.close();
        desconectaBD();
    }

    @Override
    public void insertCentroDocente(SS1_CentroDocente centro) throws RemoteException, SQLException {
        conectaBD();

        PreparedStatement st = null;

        String query = "INSERT INTO CENTRODOCENTE (nombre, cod_Universidad, direccion, localidad,"
                    + " codigo_postal, pais, telefono, email, web, activo,"
                    + " fecha_actividad, fecha_alta)"
                + " VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
        st = getConexion().prepareStatement
                    (query, ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE);
        st.setString(1, centro.getNombre());
        st.setInt(2, centro.getUniversidad().getId());
        st.setString(3, centro.getDireccion());
        st.setString(4, centro.getLocalidad());
        st.setInt(5, centro.getCodigoPostal());
        st.setString(6, centro.getPaisResidencia());
        st.setString(7, centro.getTelefono());
        st.setString(8, centro.getEmail());
        st.setString(9, centro.getWeb());
        if (centro.isActivo()) st.setString(10, "1");
        else st.setString(10, "0");
        st.setDate(11, new Date(centro.getFechaActividad().getTime()));
        st.setDate(12, new Date(centro.getFechaAlta().getTime()));
        st.execute();

        st.close();
        desconectaBD();
    }

    @Override
    public void updateCentroDocente(int id, SS1_CentroDocente centro) throws RemoteException, SQLException {
        conectaBD();

        PreparedStatement st = null;

        String query = "UPDATE CENTRODOCENTE SET nombre = ?, cod_Universidad = ?,"
                + " direccion = ?, localidad = ?, codigo_postal = ?, pais = ?,"
                + " telefono = ?, email = ?, web = ?, activo = ?, fecha_actividad = ?,"
                + " fecha_alta = ? WHERE cod_CentroDocente = " + id;
        st = getConexion().prepareStatement
                    (query, ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE);
        st.setString(1, centro.getNombre());
        st.setInt(2, centro.getUniversidad().getId());
        st.setString(3, centro.getDireccion());
        st.setString(4, centro.getLocalidad());
        st.setInt(5, centro.getCodigoPostal());
        st.setString(6, centro.getPaisResidencia());
        st.setString(7, centro.getTelefono());
        st.setString(8, centro.getEmail());
        st.setString(9, centro.getWeb());
        if (centro.isActivo()) st.setString(10, "1");
        else st.setString(10, "0");
        st.setDate(11, new Date(centro.getFechaActividad().getTime()));
        st.setDate(12, new Date(centro.getFechaAlta().getTime()));
        st.execute();

        st.close();
        desconectaBD();
    }

    @Override
    public void insertTipoEvento(SS1_TipoEvento tipoEvento) throws RemoteException, SQLException {
        conectaBD();
  
        PreparedStatement st = null;

        String query = "INSERT INTO TIPOEVENTO (descripcion, titulo, activo, fecha_actividad)"
                + " VALUES (?, ?, ?, ?)";
        st = getConexion().prepareStatement
                    (query, ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE);
        st.setString(1, tipoEvento.getDescripcionAmpliada());
        st.setString(2, tipoEvento.getTitulo());
        if (tipoEvento.isActivo()) st.setString(3, "1");
        else st.setString(3, "0");
        st.setDate(4, new Date(tipoEvento.getFechaActividad().getTime()));
        st.execute();

        query = "SELECT MAX (cod_TipoEvento) FROM TIPOEVENTO";
        st = getConexion().prepareStatement
                (query, ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE);
        ResultSet rs = st.executeQuery();
        rs.next();
        int id = rs.getInt(1);
        rs.close();

        if (tipoEvento.isRol_alumno()){
            query = "INSERT INTO TIPOEVENTO_ROLES VALUES (?, ?)";
            st = getConexion().prepareStatement
                    (query, ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE);
            st.setLong(1, 0);
            st.setLong(2, id);
            st.execute();
        }
        if (tipoEvento.isRol_docente()){
            query = "INSERT INTO TIPOEVENTO_ROLES VALUES (?, ?)";
            st = getConexion().prepareStatement
                    (query, ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE);
            st.setLong(1, 1);
            st.setLong(2, id);
            st.execute();
        }
        if (tipoEvento.isRol_empleado()){
            query = "INSERT INTO TIPOEVENTO_ROLES VALUES (?, ?)";
            st = getConexion().prepareStatement
                    (query, ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE);
            st.setLong(1, 2);
            st.setLong(2, id);
            st.execute();
        }
        if (tipoEvento.isRol_otro()){
            query = "INSERT INTO TIPOEVENTO_ROLES VALUES (?, ?)";
            st = getConexion().prepareStatement
                    (query, ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE);
            st.setLong(1, 3);
            st.setLong(2, id);
            st.execute();
        }

        st.close();
        desconectaBD();
    }

    @Override
    public void activarUsuario(int id, boolean activo) throws RemoteException, SQLException {
        try {
            conectaBD();

            ResultSet rs = select("USUARIO", "cod_Usuario = " + id);
            rs.next();
            String s = rs.getString("activo");
            if (s.equals("1")) update("USUARIO", "cod_Usuario = " + id, "activo = 0");
            else if (s.equals("0")) update("USUARIO", "cod_Usuario = " + id, "activo = 1");

            rs.close();
            desconectaBD();

        } catch (SQLException e) {
            ExceptionUtils.visualizarError(LanguageUtils.getMessage("ERR_Remote"));
        } catch (Exception e){
            ExceptionUtils.visualizarError(e.getMessage());
        }
    }

    @Override
    public void activarCentro(int id, boolean activo) throws RemoteException, SQLException {
        try {
            conectaBD();

            ResultSet rs = select("USUARIO", "cod_Usuario = " + id);
            rs.next();
            String s = rs.getString("activo");
            if (s.equals("1")) update("CENTRODOCENTE", "cod_CentroDocente = " + id, "activo = 0");
            else if (s.equals("0")) update("CENTRODOCENTE", "cod_CentroDocente = " + id, "activo = 1");

            rs.close();
            desconectaBD();

        } catch (SQLException e) {
            ExceptionUtils.visualizarError(LanguageUtils.getMessage("ERR_Remote"));
        } catch (Exception e){
            ExceptionUtils.visualizarError(e.getMessage());
        }
    }
}
